kubevirt实验部署:k8s1.23.17+kube-ovn+nfs+kubevirt+ceph 集成使用
精选
原创
flyfish225
2023-05-03 15:21:09
博主文章分类:操作系统
©著作权
文章标签
kubevirt
k8s
kube-ovn
ceph
文章分类
kubernetes
云计算
yyds干货盘点
©著作权归作者所有:来自51CTO博客作者flyfish225的原创作品,谢绝转载,否则将追究法律责任
标签(空格分隔): kubernetes系列
一:kubevirt 的简介
KubeVirt是一个Kubernetes插件,它为Kubernetes提供了在与容器相同的基础结构上提供、管理和
控制虚拟机的能力。KubeVirt是由云原生计算基金会(CNCF)赞助的开源项目,目前正处于孵化阶段。
KubeVirt使Kubernetes能够使用与容器化工作负载相同的工具来调度、部署和管理虚拟机,
从而消除了使用不同监视和管理工具的单独环境的必要性。为虚拟机和Kubernetes一起工作提供了可能。
使用KubeVirt,您可以声明:
创建虚拟机
在Kubernetes群集上调度虚拟机
启动虚拟机
停止虚拟机
删除虚拟机
虚拟机运行在Kubernetes pod中,并利用标准的Kubernetes网络和存储。
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa47979b50960.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
如果你嫌上面的架构图太繁琐,这里还有一个简化版:
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa452b6836802.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa47536c43763.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
重要组件:
1. virt-api
(1) HTTP API Server作为所有涉及虚拟化相关的处理流程的入口(Entry Point),负责更新、
验证VMI CRDs;
(2) 提供RESTful API来管理集群中虚拟机,Kubevirt采用CRD的工作方式,virt-api
提供自定义的API请求处理流程,如VNC、 Console、 Start/Stop虚拟机;
2. virt-controller
(1) 该控制器负责监控虚拟机实例VMI对象和管理集群中每个虚拟机实例VMI的状态以及与其相关的Pod;
(2) VMI对象将在其生命周期内始终与容器关联,但是,由于VMI的迁移,容器实例可能会随时间变化。
3. virt-handler
(1) 在K8S的计算节点上,virt-handler运行于Pod中,作为DaemonSet;
(2) 类似于virt-controller都是响应式的,virt-handler负责监控每个虚拟机实例的状态变化,
一旦检测到状态变化就响应并确保相应操作能达到所需(理想)状态;
(3) virt-handler负责以下几方面:保持集群级VMI Spec与相应libvirt域之间的同步;
报告Libvirt域状态和集群Spec的变化;调用以节点为中心的插件以满足VMI Spec定义的网络和存储要求。
4.virt-launcher
(1) 每个虚拟机实例(VMI)对象都会对应一个Pod,该Pod中的基础容器中运行着Kubevirt
核心组件virt-launcher;
(2) K8S或者Kubelet是不负责运行VMI的运行的,取而代之的是,群集中每个节点上的守护进程会
负责为每个Pod启动一个与VMI对象关联的VMI进程,无论何时在主机上对其进行调度。
(3) virt-launcher Pod的主要功能是提供cgroups和名称空间并用于托管VMI进程。
(4) virt-handler通过将VMI的CRD对象传递给virt-launcher来通知virt-launcher启动VMI。
然后virt-launcher在其容器中使用本地libvirtd实例来启动VMI。从此开始,
virt-launcher将监控VMI进程,并在VMI实例退出后终止;
(5) 如果K8S的Runtime在VMI退出之前试图关闭virt-launcher Pod时,
virt-launcher会将信号从K8S转发给VMI进程,并尝试推迟pod的终止,直到VMI成功关闭。
5.Libvirtd
(1) 每个VMI实例对应的Pod都会有一个libvirtd实例;
(2) virt-launcher借助于libvirtd来管理VMI实例的生命周期;
二:kubevirt实验安装
2.1 系统介绍与初始化
系统:
CentOS7.9x64
主机名:
cat /etc/hosts
----
172.16.10.11 flyfish11
172.16.10.12 flyfish12
172.16.10.13 flyfish13
172.16.10.14 flyfish14
172.16.10.15 flyfish15
172.16.10.16 flyfish16
172.16.10.17 flyfish17
-----
本次安装前4台机器,每个机器8core/8G/硬盘/dev/sda 100G,/dev/sdb 150G,/dev/sdc 100G,/dev/sdd
100G
ceph-rook 硬盘分配:
/dev/sda 系统盘
/dev/sdb metadevice 盘
/dev/sdc osd 盘
/dev/sdd osd 盘
vmware在线刷新硬盘命令
echo "- - -" >> /sys/class/scsi_host/host0/scan
echo "- - -" >> /sys/class/scsi_host/host1/scan
echo "- - -" >> /sys/class/scsi_host/host2/scan
系统关闭selinux / firewalld 清空 iptables 防火墙规则 做好无密钥认证登录。
yum -y install wget jq psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl -y
# 关闭交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a && sysctl -w vm.swappiness=0
cat /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
#
## 关闭 SeLinux
# setenforce 0
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 修改内核参数
yum -y install bridge-utils
modprobe br_netfilter
vim /etc/sysctl.conf
-----
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
-----
sysctl -p
cat /etc/security/limits.conf
* hard nofile 655360
* soft nofile 655360
* hard nproc 655360
* soft nproc 655360
* soft core 655360
* hard core 655360
root hard nofile 655360
root soft nofile 655360
EOF
###系统依赖包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
### 开启ipvs 转发
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules /tmp/tmp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @/tmp/tmp.json http://127.0
done
sleep 1
ps -ef |grep "kubectl proxy" |grep -v grep |awk '{print $2}'|xargs kill
五: 创建测试虚拟机
官方测试模板:
curl https://kubevirt.io/labs/manifests/vm.yaml
kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa4d33a651424.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
virtctl expose virtualmachine testvm --name vmiservice --target-port 22 --port 8022 --type NodePort
对外发布端口
镜像上传
上传镜像时会调用 cdi-uploadserver 创建pod,完成后销毁
查看uploadproxy-url的svc 地址:
kubectl get svc -n cdi
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa4cb1bd63911.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
上传镜像:cirros-0.4.0-x86_64-disk.img
virtctl image-upload \
--image-path="/root/kubevirt/cirros-0.4.0-x86_64-disk.img" \
--storage-class=rook-ceph-block \
--pvc-name=img-cirros-0.4.0 \
--pvc-size=5Gi \
--uploadproxy-url=https://10.104.23.34 \
--insecure \
--wait-secs=240
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa4cead620649.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
基于上传的镜像创建虚拟机
# 创建DV
vim dv.yaml
---
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: dv-cirros
namespace: default
spec:
source:
pvc:
namespace: default
name: img-cirros-0.4.0
pvc:
storageClassName: "rook-ceph-block"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
volumeMode: Block
-----
kubectl apply -f dv.yaml
![image.png](https://s2.51cto.com/images/blog/202305/03151757_64520aa5e9b9e39501.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
dv其实是跨名称空间复制pvc,可以将任意名称空间的pvc复制到指定名称空间
为实例申请一个可启动pvc,dataSource指向上面创建的dv,即pvc克隆
说明:如果是通过 virtctl image-upload 命令上传的镜像,不创建上面的dv,dataSource直接指
向 virtctl image-upload 命令上传--pvc-name也可以
kubectl get dv
![image.png](https://s2.51cto.com/images/blog/202305/03151757_64520aa56436b92864.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
创建实例,将卷指向上面创建的pvc
vim vm-crrios.yaml
----
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-cirros-bootdisk
namespace: default
spec:
storageClassName: "rook-ceph-block"
volumeMode: Block
accessModes:
- ReadWriteMany
dataSource:
kind: PersistentVolumeClaim
name: dv-cirros
resources:
requests:
storage: 5Gi
----
kubectl apply -f vm-crrios.yaml
![image.png](https://s2.51cto.com/images/blog/202305/03151757_64520aa55b74866130.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
vim vm-crrios1.yaml
----
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: vm-cirros01
spec:
running: false
template:
metadata:
labels:
kubevirt.io/size: thin
kubevirt.io/domain: vm-cirros01
spec:
domain:
devices:
disks:
- name: root-disk
disk:
bus: virtio
interfaces:
- name: default
masquerade: {}
resources:
requests:
memory: 64M
networks:
- name: default
pod: {}
volumes:
- name: root-disk
persistentVolumeClaim:
claimName: pvc-cirros-bootdisk
----
kubectl apply -f vm-crrios.yaml
![image.png](https://s2.51cto.com/images/100/blog/error_upload.png)
kubect get pvc
kubectl get vm
![image.png](https://s2.51cto.com/images/blog/202305/03151756_64520aa4cb92384270.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
打赏
赞
收藏
评论
分享
举报
上一篇:使用KuboardSpray安装k8s1.26.1 并集成kuboard管理面板
|